package main

import (
	"sync"
	"fmt"
	"time"
)

var wg sync.WaitGroup

/*何为数据的并发安全*/
func main051() {
	var money = 2000

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			for j := 0; j < 10000; j++ {
				money += 1
			}
			wg.Done()
		}()
	}

	wg.Wait()
	fmt.Println("最终金额", money)
}

func main() {
	var money = 2000

	//一支麦克
	var mt sync.Mutex

	wg.Add(1)
	go func() {
		fmt.Println("鹤姐开始抢麦")

		//谁抢到麦谁才有资格修改money,其他抢麦的协程就必须阻塞等待
		mt.Lock()
		fmt.Println("鹤姐抢到了麦，何洁开始嗨")

		money -= 300
		<-time.After(10*time.Second)

		//曲罢弃麦,其它人再去哄抢
		mt.Unlock()
		fmt.Println("鹤姐弃麦")

		wg.Done()
	}()

	wg.Add(1)
	go func() {
		fmt.Println("鹤哥开始抢麦")

		//谁抢到麦谁才有资格修改money,其他抢麦的协程就必须阻塞等待
		mt.Lock()
		fmt.Println("鹤哥抢到了麦,鹤哥开始嗨")
		money -= 500
		<-time.After(10*time.Second)
		//曲罢弃麦,其它人再去哄抢
		mt.Unlock()
		fmt.Println("鹤哥弃麦")

		wg.Done()
	}()

	/*不抢麦的人不会被阻塞*/

	wg.Add(1)
	go func() {
		fmt.Println("abcdefg")
		<-time.After(1*time.Second)
		fmt.Println("hijklmn")
		<-time.After(1*time.Second)
		fmt.Println("opqrst")
		<-time.After(1*time.Second)
		fmt.Println("uvwxyz")
		wg.Done()
	}()

	wg.Wait()
}


